home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / wakka / source / screen.c < prev    next >
Text File  |  2000-06-25  |  6KB  |  244 lines

  1. /*******************************
  2.  
  3.     わっか
  4.  
  5.         画面
  6.  
  7.  *******************************/
  8.  
  9. #include    <stdio.h>
  10. #include    <stdlib.h>
  11. #include    <sys\dos.h>
  12. #include    <sys\iocs.h>
  13.  
  14. #include    "wakka.h"
  15. #include    "screen.h"
  16. #include    "pad.h"
  17.  
  18.  
  19. #define    SPRITE_FILE    "WAKKA"            /* スプライトデータ */
  20.  
  21.  
  22. #define    BLOCK_X        16            /* ブロックの大きさ */
  23. #define    BLOCK_Y        16
  24. #define    FIELD_X        (72 + 16)        /* 盤の位置 */
  25. #define    FIELD_Y        (72 + 16)
  26.  
  27.  
  28. /*** スプライトコード *****/
  29. #define    SPR_BLOCK_S    0x010            /* ブロック側面 */
  30. #define    BG_BACK        0x100            /* 背景パターン */
  31.  
  32.  
  33. #define    SPRITE_REG    (unsigned short*)0xeb0000    /* スプライトレジスタアドレス */
  34.  
  35.  
  36. static unsigned short*    sprite_reg;            /* スプライト */
  37.  
  38. static unsigned short    block_code[] = {        /* ブロックのコード */
  39.                 0x211, 0x212,
  40.                 0x413, 0x414, 0x415, 0x416,
  41.                 0x317, 0x318, 0x319, 0x31a,
  42.                 0x41b, 0x41c,
  43.                 0x213, 0x214, 0x215, 0x216,
  44.                 0x31b, 0x31c
  45.             };
  46.  
  47.  
  48. /**********************
  49.     垂直帰線期間待ち
  50.  **********************/
  51. void    v_synch(void)
  52. {
  53.     pad_synch();                        /* パッド同期処理 */
  54.     rand();                            /* 乱数 */
  55.  
  56.     while ( !(_iocs_b_bpeek((void *)0xe88001) & 0x10) );    /* 垂直帰線期間 */
  57.     while ( _iocs_b_bpeek((void *)0xe88001) & 0x10 );    /* 垂直表示期間 */
  58. }
  59.  
  60. /***************************************
  61.     スプライト描画
  62.     引数    code = パターンコード
  63.         x, y = 表示位置
  64.  ***************************************/
  65. static
  66. void    put_sprite(unsigned short code, int x, int y)
  67. {
  68.     *sprite_reg++ = (unsigned short)x;        /* x座標 */
  69.     *sprite_reg++ = (unsigned short)y;        /* y座標 */
  70.     *sprite_reg++ = code;                /* パターンコード */
  71.     *sprite_reg++ = 3;                /* プライオリティ */
  72. }
  73.  
  74. /**************************************
  75.     ブロック描画
  76.     引数    block = ブロック番号
  77.          x, y = 描画座標
  78.  **************************************/
  79. static
  80. void    draw_block(BLOCK block, int x, int y)
  81. {
  82.     put_sprite(block_code[block], x, y);        /* ブロック上部描画 */
  83.     put_sprite((block_code[block] & 0xf00) + SPR_BLOCK_S, x, y + 16);
  84.                             /* ブロック側面描画 */
  85. }
  86.  
  87. /********************
  88.     フィールド描画
  89.  ********************/
  90. static
  91. void    draw_field(void)
  92. {
  93.     int    i, j, x, y;
  94.     BLOCK    b;
  95.  
  96.     for (i = LEN - 1, y = FIELD_Y + BLOCK_Y*(LEN - 1); i >= 0; i--, y -= BLOCK_Y) {
  97.         for (j = 0, x = FIELD_X; j < LEN; j++, x += BLOCK_X) {
  98.             if ( (b = field[i][j]) >= 0 ) {        /* ブロック描画 */
  99.                 draw_block(b, x + field_dx[i][j]*BLOCK_X/0x100,
  100.                         y + field_dy[i][j]*BLOCK_Y/0x100);
  101.             }
  102.         }
  103.     }
  104. }
  105.  
  106. /**************
  107.     画面描画
  108.  **************/
  109. void    draw_screen(void)
  110. {
  111.     int    ssp;
  112.  
  113.     ssp = _iocs_b_super(0);            /* スーパーバイザモード */
  114.     sprite_reg = SPRITE_REG;        /* スプライトレジスタ先頭 */
  115.     v_synch();                /* 垂直同期 */
  116.  
  117.     draw_field();                /* フィールド描画 */
  118.  
  119.     while ( (unsigned long)sprite_reg < (unsigned long)(SPRITE_REG + 4*0x100) ) {
  120.         sprite_reg += 3;
  121.         *sprite_reg++ = 0;        /* スプライト非表示 */
  122.     }
  123.     _iocs_b_super(ssp);            /* ユーザーモード */
  124. }
  125.  
  126. /**************************************
  127.     クリア表示、入力待ち
  128.     引数    f =  TRUE : クリア
  129.             FALSE : 正解表示
  130.     戻り値     TRUE : ゲーム続行
  131.         FALSE : ゲーム終了
  132.  **************************************/
  133. Bool    wait_clear(Bool f)
  134. {
  135.     struct _symbolptr    mes = {10, 80, "CLEAR", 2, 3, 0, 2, 0};
  136.     int    i;
  137.  
  138.     i = f ? 0 : 4;
  139.     while ( !(get_push() & (PAD_A | PAD_B)) ) {
  140.         draw_screen();                /* 画面描画 */
  141.         _iocs_bgscrlst(0, i % 64, i*2 % 64);    /* 背景スクロール */
  142.         if ( i < 4 ) {
  143.             mes.color = 0x8018 + i*0x1002;
  144.             _iocs_symbol(&mes);        /* "CLEAR"描画 */
  145.             mes.x1--;
  146.         }
  147.         i++;
  148.  
  149.         if ( esc_key ) {        /* ゲーム終了 */
  150.             return    FALSE;
  151.         }
  152.     }
  153.     _iocs_wipe();                /* グラフィック消去 */
  154.     return    TRUE;
  155. }
  156.  
  157. /************************************
  158.     背景描画
  159.     引数    pat = パターン番号
  160.  ************************************/
  161. void    draw_back(int pat)
  162. {
  163.     int    i, j;
  164.  
  165.     _iocs_bgctrlst(0, 0, 1);        /* BGページ0表示 */
  166.     _iocs_bgscrlst(0, 0, 0);        /* BG表示位置 */
  167.     pat = BG_BACK + pat*16;            /* 背景パターンコード */
  168.     for (i = 0; i < 64; i++) {
  169.         for (j = 0; j < 64; j++) {
  170.             _iocs_bgtextst(0, j, i, pat + (j % 4)*2 + (i % 2)
  171.                                 + ((i/2 + j/4) % 2)*8);
  172.         }
  173.     }
  174. }
  175.  
  176.  
  177. /****************************************
  178.     スプライトデータ読み込み
  179.     引数    fname = ファイルネーム
  180.     戻り値    0 : 読み込み完了
  181.         1 : 読み込み失敗
  182.  ****************************************/
  183. static
  184. int    load_sprite(char* fname)
  185. {
  186.     FILE*    fp;
  187.     char    *buf, *p;
  188.     unsigned short*    c;
  189.     int    i, j, size;
  190.  
  191.     _iocs_sp_init();                    /* スプライト画面初期化 */
  192.     _iocs_sp_on();                        /* スプライト画面表示 */
  193.  
  194.     if ( (buf = malloc(0x8000)) == NULL ) {
  195.         eprintf("メモリが足りません\n");
  196.         return    1;
  197.     }
  198.  
  199.     sprintf(buf, "%s.SP", fname);                /* パターンデータ */
  200.     if ( (fp = fopen(buf, "rb")) == NULL ) {
  201.         eprintf("パターンファイル \"%s\" が開けません\n", buf);
  202.         return    1;
  203.     }
  204.     size = fread(buf, 0x80, 0x100, fp);
  205.     fclose(fp);
  206.  
  207.     for (i = 0, p = buf; i < size; i++, p += 0x80) {
  208.         _iocs_sp_defcg(i, 1, p);            /* スプライト定義 */
  209.     }
  210.  
  211.     sprintf(buf, "%s.PAL", fname);                /* パレットデータ */
  212.     if ( (fp = fopen(buf, "rb")) == NULL ) {
  213.         eprintf("パレットファイル \"%s\" が開けません\n", buf);
  214.         return    1;
  215.     }
  216.     size = fread(buf, sizeof(short)*0x10, 0x0f, fp);
  217.     fclose(fp);
  218.  
  219.     c = (unsigned short*)buf;
  220.     for (j = 0; j < size; j++) {
  221.         for (i = 0; i < 0x10; i++) {
  222.             _iocs_spalet(i + (1 << 0x1f), j + 1, (int)*c++);
  223.                                 /* パレット定義 */
  224.         }
  225.     }
  226.  
  227.     free(buf);
  228.     return    0;
  229. }
  230.  
  231. /********************************
  232.     画面初期化
  233.     戻り値    0 : 初期化完了
  234.         1 : 初期化失敗
  235.  ********************************/
  236. int    init_screen(void)
  237. {
  238.     if ( load_sprite(SPRITE_FILE) ) {        /* スプライト読み込み */
  239.         return    1;
  240.     }
  241.     return    0;
  242. }
  243.  
  244. /****************** End of File *************************************************/